package com.whmall.service.crm.api;

import com.whmall.component.entity.dto.OperatorReqDTO;
import com.whmall.component.entity.dto.PageReqDTO;
import com.whmall.component.entity.dto.PageRspDTO;
import com.whmall.service.crm.entity.dto.supplierreview.*;
import com.whmall.service.crm.module.supplierreview.SupplierReviewQueryCriteria;

import java.util.List;
import java.util.Map;

/**
 * 供应商评论API
 *
 * @author alex
 * @since 2021/1/18
 */
public interface SupplierReviewApi {
    /**
     * 创建供应商评论
     *
     * @param requester 请求者
     * @param request   创建请求
     * @return 创建的评论ID
     */
    Long create(OperatorReqDTO requester, CreateSupplierReviewReqDTO request);

    /**
     * 更新供应商评论
     *
     * @param requester 请求者
     * @param reviewId  评论ID
     * @param request   更新请求
     */
    void update(OperatorReqDTO requester, Long reviewId, UpdateSupplierReviewReqDTO request);

    /**
     * 删除供应商评论
     *
     * @param requester 请求者
     * @param reviewId  评论ID
     */
    void remove(OperatorReqDTO requester, Long reviewId);

    /**
     * 同步评论标签统计，将所有未统计的评论进行统计操作。
     * 注意此操作可能会非常耗时，因此应当在定时任务或异步消息中进行调用
     */
    void syncTagStatistics();

    /**
     * 获取所有的标签分类
     *
     * @param includeTags 是否包含标签列表
     * @return 标签分类列表
     */
    List<SupplierReviewTagCategoryRspDTO> finaAllTagCategory(boolean includeTags);

    /**
     * @return 获取所有的标签
     */
    List<SupplierReviewTagRspDTO> findAllTag();

    /**
     * 查询所有的用户标签
     *
     * @return 所有的用户标签
     * @author qiao shengda
     * @since 2021/6/23
     */
    Map<String, List<SupplierUserReviewTagDTO>> findAllUserTag();

    /**
     * 查询所有的用户标签列表
     *
     * @return 所有的用户标签
     * @author qiao shengda
     * @since 2021/6/23
     */
    List<SupplierUserReviewTagDTO> findListUserTag();

    /**
     * 分页查询供应商评论
     *
     * @param pageRequest 分页请求
     * @param criteria    查询条件
     * @return 分页的供应商评论列表
     */
    PageRspDTO<SupplierReviewRspDTO> findReviewPageByQueryCriteria(PageReqDTO pageRequest,
                                                                   SupplierReviewQueryCriteria criteria);

    /**
     * 根据公司ID查找该公司的所有评论标签统计列表
     *
     * @param companyId      公司ID，即CRM供应商公司ID
     * @param includeTagInfo 返回数据内是否包含标签信息数据
     * @return 供应商评论标签统计
     */
    List<SupplierReviewTagStatisticsRspDTO> findReviewTagStatsByCompanyId(Long companyId, boolean includeTagInfo);

    /**
     * 根据公司ID集合查询评论统计
     * @param companyIds
     * @return
     */
    Map<Long, List<SupplierReviewTagStatisticsRspDTO>> findReviewTagStatisticsByCompanyIds(List<Long> companyIds);

    /**
     * 统计业务ID数量，用户判断采购订单是否录入了评价
     * @param businessIds
     * @param businessTypes
     * @param pageSources
     * @return key = businessId, value = 数量
     */
    Map<Long, Long> countByBusinessId(List<Long> businessIds, List<Integer> businessTypes, List<Integer> pageSources);
}
